package com.fourth.service;

import com.alipay.api.AlipayApiException;
import com.fourth.vo.PayInfoVO;
import com.ljx.vo.Result;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;

/**
 * @author Mr.ma
 * @since 2023/3/3 14:21
 **/
public interface UbAliPayService {

    /**
     * 支付
     * @param outTradeNo 订单编号（唯一）
     * @param subjectName 商品名称
     * @param totalAmount 订单价格
     * @return
     * @throws Exception
     */
//    String webPagePay(String outTradeNo, String subjectName, BigDecimal totalAmount) throws Exception;

    /**
     * 支付
     * @param outTradeNo 订单编号（唯一）
     * @param subjectName 商品名称
     * @param totalAmount 订单价格
     * @return
     * @throws AlipayApiException
     */
    String webPagePay(String outTradeNo, String subjectName, BigDecimal totalAmount) throws AlipayApiException;

    /**
     * 处理支付成功后的业务，由支付宝服务器调用
     * @param request
     * @return
     * @throws UnsupportedEncodingException
     * @throws AlipayApiException
     */
    String returnUrl(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException;

    /**
     * 处理支付过程中的通知
     * @param request
     * @return
     * @throws UnsupportedEncodingException
     * @throws AlipayApiException
     */
    String notifyUrl(HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException ;

    /**
     * 当面付
     * @param outTradeNo
     * @param subjectName
     * @param totalAmount
     * @return
     * @throws AlipayApiException
     */
    PayInfoVO f2fPay(String outTradeNo, String subjectName, BigDecimal totalAmount);

    /**
     * 从支付宝服务端获取支付状态
     * @param code
     * @return
     */
    Result queryPayStatus(String code);

    /**
     * 添加订单到缓存
     * @param code
     * @param value
     */
    void addRedis(String code,String value);

    /**
     * 从缓存中获取数据
     * @param code
     * @return
     */
    String getRedis(String code);

    /**
     * 执行减库存操作
     * @param goodsid
     * @param num
     * @return
     */
    Result changeStock(String goodsid,Integer num);
}
